﻿using IbsysII.Domain;
using IbsysII.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IbsysII.Service
{

    // Bedarfe 1+2+3 laden in die Teileobjekte
    class Bestellverwaltung
    {
        public static Bestellung setBestellung()
        {
            // Alle Kaufteile in Liste laden getAktuellerLagerbestandAlleKaufteile
            List<Teil> kaufteile = GUI_LOAD.getAktuellerLagerbestandAlleKaufteile(App.alleProdukteMitStammUndBewegung);

            // Leere Bestellpositionsliste
            List<Bestellposition> bestPosList = new List<Bestellposition>();

            // Produktionsbedarfe Kaufteile
            List<Teil> prodBedarf = new List<Teil>();
            
            int bestId = 1;
            double bestGesamtkosten = 0;

            foreach (Teil t in kaufteile)
            {
                foreach (Produktionsauftrag p in App.lstProgP1)
                {
                    if (p.Teil.TeilNr == t.TeilNr)
                    {
                        t.Bedarf += p.Teil.Bedarf;
                        t.BedarfN1 += p.Teil.BedarfN1;
                        t.BedarfN2 += p.Teil.BedarfN2;
                        t.BedarfN3 += p.Teil.BedarfN3;
                    }
                }
                foreach (Produktionsauftrag p in App.lstProgP2)
                {
                    if (p.Teil.TeilNr == t.TeilNr)
                    {
                        t.Bedarf += p.Teil.Bedarf;
                        t.BedarfN1 += p.Teil.BedarfN1;
                        t.BedarfN2 += p.Teil.BedarfN2;
                        t.BedarfN3 += p.Teil.BedarfN3;
                    }
                }
                foreach (Produktionsauftrag p in App.lstProgP3)
                {
                    if (p.Teil.TeilNr == t.TeilNr)
                    {
                        t.Bedarf += p.Teil.Bedarf;
                        t.BedarfN1 += p.Teil.BedarfN1;
                        t.BedarfN2 += p.Teil.BedarfN2;
                        t.BedarfN3 += p.Teil.BedarfN3;
                    }
                }

            }
           

            foreach (Teil t in kaufteile)
            {
                double bestMenge = 0;
                int Menge = 0;
                double bestLieferung = 0;
                double bestLagerzugang = 0;
                double bestellkosten = 0;
                double bestPruefung = 0;
                double durchschnittlVerbrauch = 0;
                if ((t.Bedarf + t.BedarfN1 + t.BedarfN2 + t.BedarfN3) <= 0)
                {
                    continue;
                }
                foreach (Bestellung b in App.lagerzugangZukuenftig)
                    foreach (Bestellposition b1 in b.Bestellpositionen)
                    {
                        if (b1.TeileNr == t.TeilNr)
                        {
                            bestLagerzugang += b1.Menge;
                        }
                    }
                durchschnittlVerbrauch = ((t.Bedarf + t.BedarfN1 + t.BedarfN2 + t.BedarfN3) / 4);
                double bestLieferzeit = 0;
                bestPruefung = ((t.Lagermenge + bestLagerzugang) / durchschnittlVerbrauch);
                if (t.Lieferzeit + t.Lieferzeitabweichung < 1.3)
                {
                    bestLieferzeit = bestPruefung / (t.Lieferzeit + t.Lieferzeitabweichung + 0.3);
                }
                else
                {
                    bestLieferzeit = bestPruefung / (t.Lieferzeit + t.Lieferzeitabweichung);
                }

                if (((durchschnittlVerbrauch / (bestPruefung / (t.Lieferzeit + t.Lieferzeitabweichung + 0.2))) + 0.05 * durchschnittlVerbrauch) - t.Diskontmenge <= -200)
                {
                    bestMenge = (durchschnittlVerbrauch / (bestPruefung / (t.Lieferzeit + t.Lieferzeitabweichung + 0.2))) + 0.05 * durchschnittlVerbrauch;
                }
                else
                {
                    bestMenge = t.Diskontmenge;
                }

                Menge = (int)Math.Round(bestMenge / 10) * 10;
                if (Menge >= t.Diskontmenge)
                {
                    bestellkosten = (bestMenge * (t.Preis*0.9) + t.Bestellkosten);
                }
                else
                {
                    bestellkosten = (bestMenge * t.Preis + t.Bestellkosten);
                }

                if (bestLieferzeit <= 0.9)
                {
                    bestLieferung = Int16.Parse(App.aktPeriode) + (t.Lieferzeit + t.Lieferzeitabweichung)/2;
                    bestPosList.Add(new Bestellposition(t.TeilNr, Menge, 4, (int)Math.Ceiling(bestLieferung), bestId, Math.Round(bestellkosten, 2)));
                    bestGesamtkosten += bestellkosten;
                }
                else if (bestLieferzeit <= 1.5)
                {
                    bestLieferung = Int16.Parse(App.aktPeriode) + t.Lieferzeit + t.Lieferzeitabweichung;
                    bestPosList.Add(new Bestellposition(t.TeilNr, Menge, 5, (int)Math.Ceiling(bestLieferung), bestId, Math.Round(bestellkosten, 2)));
                    bestGesamtkosten += bestellkosten;
                }
            }
            bestGesamtkosten = Math.Round(bestGesamtkosten, 2);
            Bestellung best = new Bestellung(bestId, bestPosList, bestGesamtkosten);
            return best;
        }
    }
}
